package robato.logic;

import java.io.Serializable;

public class Robot implements Serializable{
	
	private static final long serialVersionUID = -6696310133177078897L;
	Class<? extends Robot> clase = this.getClass();
	String strName = "";
	public String arrSymbols[];
	public String arrMeanings[];
	public double conocimiento[][];
	public double dblAprendizaje;

	
	public Robot(String obj[], String know[], double aprendizaje) {
		this.arrSymbols = obj;
		this.arrMeanings = know;
		this.dblAprendizaje = aprendizaje;
		this.conocimiento = new double[this.arrMeanings.length][this.arrSymbols.length];

		for (int i = 0; i < this.arrMeanings.length; i++) {
			for (int j = 0; j < this.arrSymbols.length; j++) {
				this.conocimiento[i][j] = Math.random();
			}
		}
	}


	public int getMaxIndexSymbol(int indexSymbol){
		int intRet=-1;
		double dblLearn=-1;
		
		for(int i=0; i < this.arrMeanings.length; i++){
			if( dblLearn <= this.conocimiento[i][indexSymbol] ){
				dblLearn = this.conocimiento[i][indexSymbol];
				intRet = i;
			}
		}	
		
		return intRet;
	}


	public int getMaxIndexMeaning(int intMeaning){
		int intRet=-1;
		double dblLearn=-1;
		
		for(int j=0; j < this.arrSymbols.length; j++){
			if( dblLearn <= this.conocimiento[intMeaning][j]){
				dblLearn = this.conocimiento[intMeaning][j];
				intRet = j;
			}
		}
		
		return intRet;
	}


	public void updateConocimientoRow(int intBeta, int intRow, int posJ){

		for(int j=0; j< this.arrSymbols.length; j++){
			this.conocimiento[intRow][j] = (this.dblAprendizaje * this.conocimiento[intRow][j] );//+(intBeta * (1-this.dblAprendizaje));
		}
		
		this.conocimiento[intRow][posJ] = (this.dblAprendizaje * this.conocimiento[intRow][posJ] )+(intBeta * (1-this.dblAprendizaje));
	}


	public void updateConocimientoCol(int intBeta, int intCol, int posJ){

		for(int i=0; i< this.arrSymbols.length; i++){
			this.conocimiento[i][intCol] = (this.dblAprendizaje * this.conocimiento[i][intCol] );//+(intBeta * (1-this.dblAprendizaje));
		}
		
		this.conocimiento[posJ][intCol] = (this.dblAprendizaje * this.conocimiento[posJ][intCol] )+(intBeta * (1-this.dblAprendizaje));
	}
	

	public String getSymbolAt(int pos){
		return this.arrSymbols[pos];
	}
	public String getMeaningAt(int pos){
		return this.arrMeanings[pos];
	}
	
	
	public String getName() {
		return strName;
	}
	public void setName(String strName) {
		this.strName = strName;
	}
	
	
	public String toString() {
		java.text.DecimalFormat df = new java.text.DecimalFormat("#.##");
		String str = (strName + "\tComocimiento:\n");
		
		str+="\t";
		for (int i = 0; i < this.arrSymbols.length; i++) {
			str+="\t"+arrSymbols[i]+"\t";
		}
		str+="\n";
		for (int i = 0; i < this.arrSymbols.length; i++) {
			str += "\t"+arrMeanings[i]+"\t";
			for (int j = 0; j < this.arrMeanings.length; j++) {
				str += df.format(this.conocimiento[i][j]) + "\t\t";
			}
			str += "\n";
		}
		return str;
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
//	public void updateConocimiento(double beta, String objeto, String representacion) {
//		// Si es verdadero es porque Simbolo RobotA == Simbolo RobotB.
//		// en caso contario debe ser penalizada.
//
//		int posI = this.findPosMeaning(representacion);
//		int posJ = this.findPosSymbol(objeto);
//		this.dblBeta = beta;
//		this.conocimiento[posI][posJ] = (this.dblAprendizaje * this.conocimiento[posI][posJ]) + (this.dblBeta * (1 - this.dblAprendizaje));
//		//this.normalizar(posJ);
//	}
//
//	
//	private int findPosSymbol(String obj) {
//		int posJ = -1;
//		for (int i = 0; i < this.arrSymbols.length; i++) {
//			if (this.arrSymbols[i].equalsIgnoreCase(obj)) {
//				posJ = i;
//				break;
//			}
//		}
//		return posJ;
//	}
//
//	
//	private int findPosMeaning(String obj) {
//		int posI = -1;
//		for (int i = 0; i < this.arrMeanings.length; i++) {
//			if (this.arrMeanings[i].equalsIgnoreCase(obj)) {
//				posI = i;
//				break;
//			}
//		}
//		return posI;
//	}
//
//	
//
//	
//	PUBLIC STRING DECODEMEANING(STRING STRMEANING){
//	
//	DOUBLE DBLTRASPUESTA[][]= NEW DOUBLE[THIS.ARRSYMBOLS.LENGTH][THIS.ARRMEANINGS.LENGTH];
//	FOR(INT I=0; I<ARRSYMBOLS.LENGTH; I++){
//		FOR(INT J=0; J<ARRMEANINGS.LENGTH; J++){
//			DBLTRASPUESTA[I][J] = THIS.CONOCIMIENTO[J][I];
//		}
//	}
//	
//	INT POSMEANING = THIS.FINDPOSMEANING(STRMEANING);
//	DOUBLE DBLKNOW=0;
//	INT POSITION=-1;
//	SYSTEM.OUT.PRINTLN(CLASE+".DECODEMEANING()\T"+THIS.GETNAME()+"\TPOSICION DE SIGNIFICADO: "+POSMEANING);
//	FOR( INT I=0; I<THIS.ARRSYMBOLS.LENGTH; I++ ){
//		IF(DBLTRASPUESTA[I][POSMEANING]>DBLKNOW)
//			DBLKNOW = DBLTRASPUESTA[I][POSMEANING];
//			POSITION= I;
//	}
//	SYSTEM.OUT.PRINTLN(CLASE+".DECODEMEANING()\T"+THIS.GETNAME()+"\TPOSICION DE SIMBOLO: "+POSITION+ "\T"+THIS.ARRSYMBOLS[POSITION]);
//	RETURN THIS.ARRSYMBOLS[POSITION];
//}
//
//
//PUBLIC STRING DECODESYMBOL(STRING STRSYMBOL){
//	INT POSSYMBOL= THIS.FINDPOSSYMBOL(STRSYMBOL);
//	DOUBLE DBLKNOW=0;
//	INT POSITION=-1;
//	SYSTEM.OUT.PRINTLN(CLASE+".DECODESYMBOL()\T"+THIS.GETNAME()+"\T"+"POSICION DE SIMBOLO: "+POSSYMBOL);
//	
//	FOR(INT I=0; I<THIS.ARRMEANINGS.LENGTH; I++){
//		IF(THIS.CONOCIMIENTO[I][POSSYMBOL]> DBLKNOW){
//			DBLKNOW =THIS.CONOCIMIENTO[I][POSSYMBOL];
//			POSITION= I;
//		}
//	}
//	SYSTEM.OUT.PRINTLN(CLASE+".DECODESYMBOL()\T"+THIS.GETNAME()+"\TPOSICION DE SIGNIFICADO: "+POSITION+ "\T"+THIS.ARRSYMBOLS[POSITION]);
//	RETURN THIS.ARRMEANINGS[POSITION];
//}
//	
//	
//	public String getSymbol(String significado) {
//		int  posMeaning = this.findPosMeaning(significado);
//		double dblProb = 0;
//		int intPos = -1;
//				
//		for (int j = 0; j < this.arrSymbols.length; j++) {
//					if (this.conocimiento[posMeaning][j] > dblProb) {
//						dblProb = this.conocimiento[posMeaning][j];
//						intPos = j;
//					}
//		}
//		return this.arrSymbols[intPos];
//	}
//	
//	
//	public String getMeaning(String simbolo) {
//		double dblProb = 0;
//		int intPos = -1;
//
//		for (int j = 0; j < this.arrSymbols.length; j++) {
//			if (simbolo.equalsIgnoreCase(this.arrSymbols[j])) {
//				for (int i = 0; i < this.arrMeanings.length; i++) {
//					if (this.conocimiento[i][j] > dblProb) {
//						dblProb = this.conocimiento[i][j];
//						intPos = i;
//					}
//				}
//				break;
//			}
//		}
//		return this.arrMeanings[intPos];
//	}
//	
//	
//	public String getRandomSignificado() {
//		int intPos = -1;
//		intPos = (int) (Math.random() * (arrMeanings.length - 1));
//		return arrMeanings[intPos];
//	}
//	
//	public String getRandomSimbolo() {
//		int intPos = -1;
//		intPos = (int) (Math.random() * (arrSymbols.length - 1));
//		return arrSymbols[intPos];
//	}
//	
//	private void normalizar(int pos) {
//		double dblTotal = 0;
//
//		for (int i = 0; i < this.arrMeanings.length; i++) {
//			dblTotal += this.conocimiento[i][pos];
//		}
//
//		for (int i = 0; i < this.arrMeanings.length; i++) {
//			this.conocimiento[i][pos] = (this.conocimiento[i][pos] / dblTotal);
//		}
//	}
}
